#include "ControladorVentanaEditEscenario.h"
#include "Circulo.h"
#include "VentanaEscenarios.h"
#include <iostream>

//ControladorVentanaEditEscenario::ControladorVentanaEditEscenario(){}

ControladorVentanaEditEscenario::ControladorVentanaEditEscenario(VentanaEditarEsc *ventEditEsc){
	this->ventana = ventEditEsc;

}

void ControladorVentanaEditEscenario::crearVentana(){
	this->ventana->graficar();
}

Ventana* ControladorVentanaEditEscenario::getVentana(){
	return this->ventana;
}

void ControladorVentanaEditEscenario::controlarEventos(){
	
	Figura *figura;
	Rectangulo *obstaculo, *nuevoObstaculo;
	std::list<Figura*>::iterator iter;
	std::list<Rectangulo*>::iterator iterObs;
	bool encontro = false;
	bool terminar = false;
	bool terminarCancelar = false;
	SDL_Event evento;
	int x = 0, y = 0;
	//loop

	while(terminar == false && !terminarCancelar) {
		SDL_Flip(this->getVentana()->getScreen());//encargado de que se repinte
				
		while (SDL_PollEvent(&evento)) {

			if ((evento.type == SDL_MOUSEBUTTONDOWN)&&
				(evento.button.button == SDL_BUTTON_LEFT)){

				SDL_GetMouseState(&x, &y);

				if(estaDentroDelScroll(x,y)){
					if(esBotonScroll(x,y)){this->moverObstaculosScroll(x,y);}
					else {//busco obstaculos para clonar
						int j= 1;
						VentanaEditarEsc* ventEditEsc= (VentanaEditarEsc*)this->getVentana();
						iterObs = ventEditEsc->getScroll()->iteratorListaObstaculos();
						while(j<=ventEditEsc->getScroll()->sizeListaObstaculos() && !encontro){
							obstaculo = *iterObs;
							if(obstaculo->pertenecePixel(x,y)){
								SDL_SaveBMP(this->getVentana()->getScreen(),"Temp/venBackup.bmp");
								nuevoObstaculo =(Rectangulo*) this->clonarFigura(obstaculo);
								this->getVentana()->addFigDinamicas(nuevoObstaculo);
								nuevoObstaculo->dibujar(this->getVentana()->getScreen());

								encontro = true;
							}//if pertence pixel del obstaculo
							j++;
							iterObs++;
						}//while de busq de obstaculo
					}// else de clonar
				}//if esta dentro del scroll

				else{//busco boton de ventanaEditarEsc o es para soltar el obs si es q esta en contrado
					if (!encontro){ //se busaca boton
						int i=1;
						iter = this->getVentana()->iteratorListaFiguras();
						while(i<=this->getVentana()->sizeListaFiguras() && !encontro){
							figura = *iter;
							if( figura->pertenecePixel(x,y)){
								//Evento sobre boton guardar
								if (figura->getId().compare("btGuardar") == 0){
									//FIXME guardar los cambios
									terminar=true;
								}
								//Evento sobre boton cancelar
								if (figura->getId().compare("btCancelar") == 0){
									Ventana* ventEscenarios = VentanaEscenarios::obtenerInstancia();
									ventEscenarios->graficar();
									terminarCancelar=true;
								}
								//Evento sobre boton actulalizar
								if (figura->getId().compare("btActualizar") == 0){
									//FIXME implementar
								}
							}// if pertenece pixel
							iter++;
							i++;
						}//while busca pixel

					}//if si no encontro para buscar la algun boton
					else if (encontro) { //si se encontro se hace el drop
						encontro = !(this->soltarObstaculo(nuevoObstaculo,x,y));
					}// if del drop
				}// else de la busq en la ventana del boton o soltar

			}//if click

			//eventos de movimiento del mouse
		    if(evento.type == SDL_MOUSEMOTION){
		        if(encontro){
		            //va a actualizar la posicion de la fig que encontro
		            SDL_GetMouseState(&x, &y);
		            actualizarPosicionFigura(nuevoObstaculo, x, y);
		            refrescarPantallaArrastre(nuevoObstaculo);
		        }
		       //FIXME HACER EL MOUSE OVER SOBRE ALGUNA TECLA
		    }
		    //eventos de salida de la pantalla
			terminar =this->salirPantalla(evento);
		}
	}
}


Figura *ControladorVentanaEditEscenario::clonarFigura(Figura *figura){
	Posicion *p = new Posicion (figura->getPosicion()->getX()-10, figura->getPosicion()->getY());
	Figura *figNueva = new Rectangulo(figura->getId(),50,50, p);
	figNueva->setIdTextura(figura->getIdTextura());
	return figNueva;
}

void ControladorVentanaEditEscenario::refrescarPantalla(){
	this->ventana->pintarPantalla();

	VentanaEditarEsc* vent = (VentanaEditarEsc*)this->getVentana();
	vent->getScroll()->dibujar(this->ventana->getScreen());

	Figura *fig;
	std::list<Figura*>::iterator iterDin, iter;
	iterDin= this->getVentana()->iteratorListaFigDinamicas();
	iter = this->getVentana()->iteratorListaFiguras();
	int j= 1;
	//grafica las figuras de listaFiguras (botones, escenario)
	while(j<=this->ventana->sizeListaFiguras()){
		fig = *iter;
		fig->dibujar(this->ventana->getScreen());
		iter++;
		j++;
	}
	//Grafica las figuras de listaFigurasDin
	j= 1;
	while(j<=this->ventana->sizeListaFigDinamicas()){
		fig = *iterDin;
		fig->dibujar(this->ventana->getScreen());
		iterDin++;
		j++;
	}

	SDL_Flip(this->getVentana()->getScreen());

}

void ControladorVentanaEditEscenario::refrescarPantallaArrastre(Figura *figura){
	std::cout<<"refrescar pantalla por arrastre"<< std::endl;
	SDL_Surface* back=SDL_LoadBMP("Temp/venBackup.bmp");
	SDL_BlitSurface(back,NULL,this->getVentana()->getScreen(),NULL);
	figura->dibujar(this->ventana->getScreen());
	SDL_Flip(this->getVentana()->getScreen());
	SDL_FreeSurface(back);
}

void ControladorVentanaEditEscenario::actualizarPosicionFigura(Figura *fig , int x, int y){
	fig->getPosicion()->setX(x);
	fig->getPosicion()->setY(y);
}

bool ControladorVentanaEditEscenario::estaDentroDelEscenario(int x, int y){
	if(x>10 && x<766 && y>10 && y<560) return true;
	else return false;
}

bool ControladorVentanaEditEscenario:: salirPantalla(SDL_Event evento){
	if(((evento.type == SDL_KEYDOWN)&&(evento.key.keysym.sym == SDLK_ESCAPE)) 
		||(evento.type == SDL_QUIT)){
			Ventana* ventEscenarios = VentanaEscenarios::obtenerInstancia();
			ventEscenarios->graficar();
			return true;
		}
	else return false;
}

void ControladorVentanaEditEscenario::controlarEventosMouse(SDL_Event evento){

}

bool ControladorVentanaEditEscenario::esEventoDelMouse(SDL_Event evento){
	if ((evento.type == SDL_MOUSEBUTTONDOWN) || (evento.type == SDL_MOUSEMOTION))
		return true;
	else return false;
}

bool ControladorVentanaEditEscenario::estaDentroDelScroll(int x,int y){
	if(x>=820 && x<=890 && y>=10 && y<=610)return true;
	else return false;
}

bool ControladorVentanaEditEscenario::esBotonScroll(int x, int y){
	VentanaEditarEsc* ventEdiEsc = (VentanaEditarEsc*)this->getVentana();
	if (ventEdiEsc->getScroll()->getBotonDown()->pertenecePixel(x,y) ||
			ventEdiEsc->getScroll()->getBotonUp()->pertenecePixel(x,y))return true;
	else return false;

}

bool ControladorVentanaEditEscenario::soltarObstaculo(Rectangulo *obstaculo, int x, int y){
	if(this->estaDentroDelEscenario(x,y)){
		this->actualizarPosicionFigura(obstaculo, x, y);
		this->refrescarPantalla();
		return true; 
	}
	else return false;
}

void ControladorVentanaEditEscenario::moverObstaculosScroll(int x, int y){
	VentanaEditarEsc* ventEdiEsc = (VentanaEditarEsc*)this->getVentana();

	if (ventEdiEsc->getScroll()->getBotonDown()->pertenecePixel(x,y)){
		if (abs(ventEdiEsc->getScroll()->getLimiteInf())!= ventEdiEsc->getScroll()->getTope()){
			ventEdiEsc->getScroll()->actualizarPosiciones(-15);
			ventEdiEsc->getScroll()->setLimiteInf(ventEdiEsc->getScroll()->getLimiteInf()+1);
			if (abs(ventEdiEsc->getScroll()->getLimiteSup())!= 0){
				ventEdiEsc->getScroll()->setLimiteSup(ventEdiEsc->getScroll()->getLimiteSup()-1);}
		}
	}//botonDown

		if(ventEdiEsc->getScroll()->getBotonUp()->pertenecePixel(x,y)){
			if (abs(ventEdiEsc->getScroll()->getLimiteSup())!= ventEdiEsc->getScroll()->getTope()){
				ventEdiEsc->getScroll()->actualizarPosiciones(15);
				ventEdiEsc->getScroll()->setLimiteSup(ventEdiEsc->getScroll()->getLimiteSup()+1);
				if (abs(ventEdiEsc->getScroll()->getLimiteInf())!= 0){
					ventEdiEsc->getScroll()->setLimiteInf(ventEdiEsc->getScroll()->getLimiteInf()-1);}
				}
		}//botonUp

		ventEdiEsc->getScroll()->dibujar(this->getVentana()->getScreen());
		Figura* figura = (Figura*)ventEdiEsc->getScroll()->getPanelScroll();
		int coordX = figura->getPosicion()->getX();
		int coordY = figura->getPosicion()->getY();
		int ancho = ventEdiEsc->getScroll()->getPanelScroll()->getBase();
		int alto = ventEdiEsc->getScroll()->getPanelScroll()->getAltura();
		SDL_UpdateRect(this->ventana->getScreen(), coordX, coordY, ancho, alto);

}

ControladorVentanaEditEscenario::~ControladorVentanaEditEscenario(void){}
